/*
 * @Author: 码农 2646995216@qq.com
 * @Date: 2025-03-18 23:10:47
 * @LastEditors: 码农 2646995216@qq.com
 * @LastEditTime: 2025-03-19 21:19:51
 * @FilePath: /netcomputer/calculator.hpp
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
#include "protocol.hpp"

enum
{
	Div_zero = 1, // 除0，错误
	Sur_zero,	  // 余0，错误
	Other_Oper,	  // 运算符错误
};

class Computer
{
public:
	Computer()
	{
	}

	// 发来一个请求，将计算结果放入回应中，并且返回回应
	Response CalculatorHander(Request &req)
	{
		Response resp;
		switch (req._op)
		{
		case '+':
			resp._result = req._x + req._y;
			break;
		case '-':
			resp._result = req._x - req._y;
			break;
		case '*':
			resp._result = req._x * req._y;
			break;
		case '/':
			if (req._y == 0)
				resp._exitcode = Div_zero;
			else
				resp._result = req._x / req._y;
			break;
		case '%':
			if (req._y == 0)
				resp._exitcode = Sur_zero;
			else
				resp._result = req._x % req._y;
			break;
		default:
			resp._exitcode = Other_Oper;
			break;
		}

		return resp;
	}

	// 传入一个完整的报文
	string Calculator(string &package)
	{
		// 用来存放报文的正文
		string content;
		// 去报头，得到正文
		bool n = DeleteMasthead(package, content);
		if (!n)
			return "";

		// 字符串"x op y"转化为Request结构体
		Request req;
		n = req.desocialization(content); // 反序列化后，数据已经填入req中的私有成员变量中
		if (!n)
			return "";
		// 现在这个没有用了，所以将其置为空
		content = "";
		// 将其放入CalculatorHander函数中，处理得到回应
		Response resq = CalculatorHander(req);

		resq.Serialization(content); // 将其序列化，并且将结果放入其中
		content=AddMasthead(content);//添加报头
		
		return content; // 返回字符串结果
	}

	~Computer()
	{
	}
};